//
//  NHTFunction.h
//  DevelopDemo
//
//  Created by NHT on 2024/6/7.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NHTFunction : NSObject

/**
 权限授权状态，额外返回值看具体方法
 
 - PowerStateAllow: 允许
 - PowerStateRefuse: 不允许
 - PowerStateUndefined: 未申请，未定义
 */
typedef NS_ENUM(NSInteger,PowerState) {
    PowerStateAllow = 1,
    PowerStateRefuse = 2,
    PowerStateUndefined = 3,
};


+(instancetype)share;


/// 设置调试模式，这个时候声音为0.4
-(void)setDebugMode;

#pragma mark---打电话
/// 拨打电话
/// - Parameter phoneNumber: 电话号码
-(void)callPhone:(NSString *)phoneNumber;

#pragma mark---播放音频文件

/// 播放网络音频
/// - Parameters:
///   - url: 文件地址
///   - repeatPlay: 是否重复
-(void)startPlayUrlAudio:(NSString *)url repeatPlay:(BOOL)repeatPlay;

/// 播放本地音频
/// - Parameters:
///   - filePath: 文件路径path
///   - repeatPlay: 是否重复
-(void)startPlayLocalAudio:(NSString *)filePath  repeatPlay:(BOOL)repeatPlay;


/// 播放本地音频
/// - Parameters:
///   - name: 文件名称
///   - type: 文件类型
-(void)startPlayLocalAudio:(NSString *)name type:(NSString *)type repeatPlay:(BOOL)repeatPlay;

///停止播放音频
-(void)stopPlayAudio;


#pragma mark---闪光灯

/// 打开闪光灯
-(void)startFlash;
///关闭闪光灯
-(void)stopFlash;

#pragma mark---振动
/// 开始振动
-(void)startShock;

/// 停止振动
-(void)stopShock;

#pragma mark---语音播报
#warning 需要后台播放的话，要配置background modes,并且勾选 audio，airplay，....项
/// 语音播报文字
/// - Parameters:
///   - text: 需要播报的文字
///   - repeatPlay: 是否需要重复播放
-(void)startChangeTextToSpeech:(NSString *)text repeatPlay:(BOOL)repeatPlay;

/// 语音播报文字
/// - Parameters:
///   - text: 需要播报的文字
///   - repeatPlay: 是否需要重复播放
///   - language: 播放时的语言， zh-CN  zh-TW   zh-HK
-(void)startChangeTextToSpeech:(NSString *)text repeatPlay:(BOOL)repeatPlay language:(NSString *)language;


/// 设置语音播报的声音大小
/// - Parameter newVolume: 设置的声音
-(void)setChangeTextToSpeechVolume:(float)newVolume;

/// 停止播放文字
-(void)stopChangeTextToSpeech;

#pragma mark---跳转到指定APP在Appstore的页面
/// 跳转到指定APP在Appstore的页面
/// - Parameter appID: app的id
-(void)gotoAppStoreUpdate:(NSString *)appID;

#pragma mark---权限检查，除去推送如果未申请过会自动申请；已被拒绝的默认会显示”前往设置“弹窗可配置为不显示
#warning 除去推送如果未申请过会自动申请；已被拒绝的默认会显示”前往设置“弹窗可配置为不显示

///非首次申请权限获取到校验结果是拒绝时，是否显示"前往设置"弹窗，默认弹窗
@property (nonatomic,assign) BOOL  showRefuseAlert;
///显示”前往设置“弹窗时是否需要取消按钮，默认显示
@property (nonatomic,assign) BOOL  refuseAlertShowCancel;

/// 校验是否有--推送权限，不会自动申请权限，只是校验， info.plist中添加--NSUserNotificationsUsageDescription
/// - Parameter AllowBlock: 权限结果回调，不包含授权框弹出后的结果回调
-(void)checkIsHavePower_Push:(void (^)(NSInteger status))allowBlock;

/// 校验是否有--定位权限，info.plist中添加--NSLocationWhenInUseUsageDescription，NSLocationAlwaysAndWhenInUseUsageDescription
/// - Parameter AllowBlock: 权限结果回调，包含授权框弹出后的结果回调
-(void)checkIsHavePower_Location:(void (^)(NSInteger status))allowBlock;

/// 校验是否有--相册权限，info.plist中添加--NSPhotoLibraryUsageDescription，NSPhotoLibraryAddUsageDescription
/// - Parameter allowBlock: 权限结果回调，包含授权框弹出后的结果回调
-(void)checkIsHavePower_Photo:(void (^)(NSInteger status))allowBlock;

/// 校验是否有--相机权限，info.plist中添加--NSCameraUsageDescription
/// - Parameter allowBlock: 权限结果回调，包含授权框弹出后的结果回调
-(void)checkIsHavePower_Camera:(void (^)(NSInteger status))allowBlock;

/// 校验是否有--通讯录权限，info.plist中添加--NSContactsUsageDescription
/// - Parameter allowBlock: 权限结果回调，包含授权框弹出后的结果回调
-(void)checkIsHavePower_Contacts:(void (^)(NSInteger status))allowBlock;

/// 校验是否有--麦克风权限，info.plist中添加--NSMicrophoneUsageDescription
/// - Parameter allowBlock: 权限结果回调，包含授权框弹出后的结果回调
-(void)checkIsHavePower_Microphone:(void (^)(NSInteger status))allowBlock;


@end

NS_ASSUME_NONNULL_END
